package com.test.time;

import org.apache.commons.lang3.StringUtils;

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
import java.util.stream.Stream;

/**
 * 报表时间周期.
 * 报表周期目前分：年月日
 */
public enum ReportTimePeriodEnum implements BaseEnum<String> {

    /**
     * 年报表
     */
    YEAR("YEAR", "年报表") {
        @Override
        public LocalDate getDateStart(final LocalDate localDate) {

            // 对应年的1月1日
            return LocalDate.of(localDate.getYear(), 1, 1);
        }

        @Override
        public LocalDate getDateEnd(final LocalDate localDate) {

            return getDateStart(localDate).plusYears(1);
        }
    },

    /**
     * 月报表
     */
    MONTH("月", "月报表") {
        @Override
        public LocalDate getDateStart(final LocalDate localDate) {

            // 每月1号
            return localDate.withDayOfMonth(1);
        }

        @Override
        public LocalDate getDateEnd(final LocalDate localDate) {

            return getDateStart(localDate).plusMonths(1);
        }
    },

    /**
     * 周报表
     */
    WEEK("WEEK", "周报表") {
        @Override
        public LocalDate getDateStart(final LocalDate localDate) {
            // 杭研的周报表定义：从周一到周日
            // 获取当前或者之前的周1
            return localDate.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
        }

        @Override
        public LocalDate getDateEnd(final LocalDate localDate) {

            return getDateStart(localDate).plusWeeks(1);
        }
    };

    /**
     * 枚举值编码.
     **/
    private String value;
    /**
     * 枚举值中文名称.
     **/
    private String name;

    /**
     * 构造函数
     * @param value 值
     * @param name 名称
     */
    ReportTimePeriodEnum(final String value, final String name) {
        this.name = name;
        this.value = value;
    }

    /**
     * Gets the value of value.
     *
     * @return the value of value
     */
    @Override
    public String getValue() {
        return value;
    }

    /**
     * Gets the value of name.
     *
     * @return the value of name
     */
    @Override
    public String getName() {
        return name;
    }

    /**
     * 获取指定时间点报表周期的开始时间
     * @param localDate 指定时间点
     * @return 报表开始时间
     */
    public abstract LocalDate getDateStart(final LocalDate localDate);

    /**
     * 获取指定时间点报表周期的结束时间
     * @param localDate 指定时间点
     * @return 报表结束时间
     */
    public abstract LocalDate getDateEnd(final LocalDate localDate);

    /**
     * 根据value获取名称.
     * @return java.lang.String
     **/
    public static String getNameByValue(final String value) {
        return  Stream.of(ReportTimePeriodEnum.values())
            .filter(x -> StringUtils.equals(x.getValue(), value)).findFirst()
            .map(ReportTimePeriodEnum::getName)
            .orElse(null);
    }


}
